With the Framer Motion library, we can render animations in our React app easily.
In this article, we’ll take a look at how to get started with Framer Motion.
CSS Variables
Motion components can accept CSS variables
For example, we can write:
import { motion } from "framer-motion";
import React from "react";
export default function App() {
return (
<>
<motion.ul
initial={{ "--rotate": "0deg" }}
animate={{ "--rotate": "360deg" }}
transition={{ duration: 2, repeat: Infinity }}
>
<li style={{ transform: "rotate(var(--rotate))" }}>foo</li>
<li style={{ transform: "rotate(var(--rotate))" }}>bar</li>
<li style={{ transform: "rotate(var(--rotate))" }}>baz</li>
</motion.ul>
</>
);
}
We set the rotate
CSS variable to a value.
We set the value for it before the animation with the initial
prop.
And we set the value for it after the animation with the animate
prop.
Then we use them in the li
to rotate the li
elements.
The transition
prop has duration
to 2 to rotate for 2 seconds.
And we have repeat
set to Infinity
to repeat infinite times.
Performance
Framer Motion animates values outside the React render cycle to increase performance.
For example, we can write:
import { motion } from "framer-motion";
import React from "react";
export default function App() {
return (
<>
<motion.div
style={{ x: 0, backgroundColor: "red", width: 100, height: 100 }}
animate={{ x: 100 }}
/>
</>
);
}
to get GPU accelerated animation by using the motion.div
with motion value x
.
If we specify CSS properties in the style
and animate
props, then we get CPU acceleration.
So if we have:
import { motion } from "framer-motion";
import React from "react";
export default function App() {
return (
<>
<motion.div
style={{
position: "absolute",
left: 0,
backgroundColor: "red",
width: 100,
height: 100
}}
animate={{ left: 100 }}
/>
</>
);
}
Then the left
property will be animated by the CPU, which is slower than animating the x
motion value with the GPU.
motion
components are fully compatible with server-side rendering, except for the scale
, rotate
, pathLength
, pathOffset
, and pathSpacing
properties.
Props
Motion components haves a few props.
initial
The initial
prop lets us set the styles that are applied to the motion component when the animation starts.
For example, we can write:
import { motion } from "framer-motion";
import React from "react";
export default function App() {
return (
<>
<motion.div
initial={{ opacity: 1 }}
style={{
backgroundColor: "red",
width: 100,
height: 100
}}
animate={{ opacity: 0 }}
/>
</>
);
}
to set the opacity
of the div to 1 when we start animating the div.
We can also pass in a variant name as the value of initial
:
import { motion } from "framer-motion";
import React from "react";
const variants = {
visible: {
opacity: 1,
transition: { duration: 2 }
}
};
export default function App() {
return (
<>
<motion.div
initial="visible"
variants={variants}
style={{
backgroundColor: "red",
width: 100,
height: 100
}}
animate={{ opacity: 0 }}
/>
</>
);
}
We pass in the property name in the variants
object to apply the styles within the property.
Conclusion
We can add animations with better performance with GPU acceleration.
Also, we can set styles to apply when the animation starts.